# 字典
"""
空字典：
用{}定义： 字典变量名 = {}
类实例化方式定义： 字典变量名 = dict()
非空字典【常见】：
字典变量名 = {键1:值1,键2:值2,...}
注意事项
字典中的键一般使用字符串，其中键名不能重复（重复了数据会被覆盖）
字典中的数据俗称“键值对”
"""
info = {}
info1 = dict()
print(type(info), type(info1))
print(info)
# 非空字典
info2 = {"name": "张三", "age": 22, "height": 1.88}
print(info2)
print(type(info2))

# 1.键名不能重复
# 2.键的数据类型可以任意（推荐用字符串）

# 字典的使用
# 字典新增或修改值
# 语法格式： 字典名[键]=值
# 注：字典中键存在则修改值，键不存在则新增值

info = {"name": "张三"}
# 将张三修改为李四
info["name"] = "李四"
# 查看原有字典
print(info) # {'name': '李四'}
# 增加年龄为22岁
info["age"] = 22
# 查看原有字典
print(info) # {'name': '李四', 'age': 22}
# 结论：
# 1.字典中键存在修改值，不存在新增键和值

# 字典删除值
# 语法格式： 字典名.pop(键)
# 注意事项：
# 键存在删除对应值，键不存在，则代码报错
info = {'name': '李四', 'age': 22}
# 删除年龄22
info.pop("age")
# 查看原来字典
print(info)
# 删除性别
# info.pop("sex") # KeyError: 'sex'
# 结论：
# 1.键存在直接删除对应键和值，键不存在报错

# 字典中取值
# 语法格式：
# 格式1： 变量 = 字典名[键]
# 格式2： 变量 = 字典名.get(键)
# 注意事项：
# 格式1键存在返回对应值，键不存在，则代码报错
# 格式2键存在返回对应值，键不存在，则返回None（空值）
info = {
"name": "tom",
"age": 18,
"gender": "男",
"hobby": {"read": "小说", "sport": ["篮球", "足球"]}
}
# 查询年龄
# a1 = info["age"]
# print(a1)
print(info["age"])
# a2 = info.get("age")
# print(a2)
print(info.get("age"))
# 查询键aa的值
# print(info["aa"]) # 代码报错：KeyError: 'aa' 键aa不存在
print(info.get("aa")) # None 表示aa键不存在
# 思考：如何获取值："足球"
# a1 = info["hobby"]
# print(a1) # {'read': '小说', 'sport': ['篮球', '足球']}
# print(a1["sport"]) # ['篮球', '足球']
# print(a1["sport"][1])
# 组合:从外部一层一层获取递进
print(info["hobby"]["sport"][1])
print(info.get("hobby").get("sport")[1])

# 字典的合并/新增
# 语法格式： 字典2.update(字典1)
# 注意事项：字典2中如果存字典1的键则被更新，否则被新增
dict1 = {"name": "张三", "age": 18}
# 定义字典2
dict2 = {"height": 1.88}
# 将字典2合并到字典1
dict1.update(dict2)
print(dict1)

# 字典的遍历
"""
遍历字典键：
语法格式： for 临时变量 in 字典名.keys():
说明：取出字典中的所有键，容器后面可以不写 .keys()
遍历字典值：
语法格式： for 临时变量 in 字典名.values():
说明：取出字典中的所有值
遍历键和值：
语法格式： for 键变量,值变量 in 字典名.items():
说明：取出字典中的所有键和值
"""

info = {
    "name": "tom",
    "age": 18,
    "gender": "男"
}
# 遍历获取字典中所有键
for i in info.keys():
    print(f"字典的键是：{i}")
# 遍历获取字典中所有值
for i in info.values():
    print(f"字典的值是：{i}")
# 遍历获取字典的键和值
for k, v in info.items():
    print(f"{k} = {v}")

